home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / interp / perl-5.003.tar.gz / perl-5.003.tar / perl-5.003 / mg.c < prev    next >
C/C++ Source or Header  |  1996-03-25  |  26KB  |  1,410 lines

  1. /*    mg.c
  2.  *
  3.  *    Copyright (c) 1991-1994, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. /*
  11.  * "Sam sat on the ground and put his head in his hands.  'I wish I had never
  12.  * come here, and I don't want to see no more magic,' he said, and fell silent."
  13.  */
  14.  
  15. #include "EXTERN.h"
  16. #include "perl.h"
  17.  
  18. /* Omit -- it causes too much grief on mixed systems.
  19. #ifdef I_UNISTD
  20. # include <unistd.h>
  21. #endif
  22. */
  23.  
  24. /*
  25.  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
  26.  */
  27.  
  28. struct magic_state {
  29.     SV* mgs_sv;
  30.     U32 mgs_flags;
  31. };
  32. typedef struct magic_state MGS;
  33.  
  34. static void restore_magic _((void *p));
  35.  
  36. static MGS *
  37. save_magic(sv)
  38. SV* sv;
  39. {
  40.     MGS* mgs;
  41.  
  42.     assert(SvMAGICAL(sv));
  43.  
  44.     mgs = (MGS*)safemalloc(sizeof(MGS));
  45.     mgs->mgs_sv = sv;
  46.     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
  47.     SAVEDESTRUCTOR(restore_magic, mgs);
  48.  
  49.     SvMAGICAL_off(sv);
  50.     SvREADONLY_off(sv);
  51.     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
  52.  
  53.     return mgs;
  54. }
  55.  
  56. static void
  57. restore_magic(p)
  58. void* p;
  59. {
  60.     MGS *mgs = (MGS*)p;
  61.     SV* sv = mgs->mgs_sv;
  62.  
  63.     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
  64.     {
  65.     if (mgs->mgs_flags)
  66.         SvFLAGS(sv) |= mgs->mgs_flags;
  67.     else
  68.         mg_magical(sv);
  69.     if (SvGMAGICAL(sv))
  70.         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
  71.     }
  72.  
  73.     Safefree(mgs);
  74. }
  75.  
  76.  
  77. void
  78. mg_magical(sv)
  79. SV* sv;
  80. {
  81.     MAGIC* mg;
  82.     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
  83.     MGVTBL* vtbl = mg->mg_virtual;
  84.     if (vtbl) {
  85.         if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
  86.         SvGMAGICAL_on(sv);
  87.         if (vtbl->svt_set)
  88.         SvSMAGICAL_on(sv);
  89.         if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
  90.         SvRMAGICAL_on(sv);
  91.     }
  92.     }
  93. }
  94.  
  95. int
  96. mg_get(sv)
  97. SV* sv;
  98. {
  99.     MGS* mgs;
  100.     MAGIC* mg;
  101.     MAGIC** mgp;
  102.  
  103.     ENTER;
  104.     mgs = save_magic(sv);
  105.  
  106.     mgp = &SvMAGIC(sv);
  107.     while ((mg = *mgp) != 0) {
  108.     MGVTBL* vtbl = mg->mg_virtual;
  109.     if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
  110.         (*vtbl->svt_get)(sv, mg);
  111.         /* Ignore this magic if it's been deleted */
  112.         if (*mgp == mg && (mg->mg_flags & MGf_GSKIP))
  113.         mgs->mgs_flags = 0;
  114.     }
  115.     /* Advance to next magic (complicated by possible deletion) */
  116.     if (*mgp == mg)
  117.         mgp = &mg->mg_moremagic;
  118.     }
  119.  
  120.     LEAVE;
  121.     return 0;
  122. }
  123.  
  124. int
  125. mg_set(sv)
  126. SV* sv;
  127. {
  128.     MGS* mgs;
  129.     MAGIC* mg;
  130.     MAGIC* nextmg;
  131.  
  132.     ENTER;
  133.     mgs = save_magic(sv);
  134.  
  135.     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
  136.     MGVTBL* vtbl = mg->mg_virtual;
  137.     nextmg = mg->mg_moremagic;    /* it may delete itself */
  138.     if (mg->mg_flags & MGf_GSKIP) {
  139.         mg->mg_flags &= ~MGf_GSKIP;    /* setting requires another read */
  140.         mgs->mgs_flags = 0;
  141.     }
  142.     if (vtbl && vtbl->svt_set)
  143.         (*vtbl->svt_set)(sv, mg);
  144.     }
  145.  
  146.     LEAVE;
  147.     return 0;
  148. }
  149.  
  150. U32
  151. mg_len(sv)
  152. SV* sv;
  153. {
  154.     MAGIC* mg;
  155.     char *junk;
  156.     STRLEN len;
  157.  
  158.     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
  159.     MGVTBL* vtbl = mg->mg_virtual;
  160.     if (vtbl && vtbl->svt_len) {
  161.         ENTER;
  162.         save_magic(sv);
  163.         /* omit MGf_GSKIP -- not changed here */
  164.         len = (*vtbl->svt_len)(sv, mg);
  165.         LEAVE;
  166.         return len;
  167.     }
  168.     }
  169.  
  170.     junk = SvPV(sv, len);
  171.     return len;
  172. }
  173.  
  174. int
  175. mg_clear(sv)
  176. SV* sv;
  177. {
  178.     MAGIC* mg;
  179.  
  180.     ENTER;
  181.     save_magic(sv);
  182.  
  183.     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
  184.     MGVTBL* vtbl = mg->mg_virtual;
  185.     /* omit GSKIP -- never set here */
  186.     
  187.     if (vtbl && vtbl->svt_clear)
  188.         (*vtbl->svt_clear)(sv, mg);
  189.     }
  190.  
  191.     LEAVE;
  192.     return 0;
  193. }
  194.  
  195. MAGIC*
  196. mg_find(sv, type)
  197. SV* sv;
  198. int type;
  199. {
  200.     MAGIC* mg;
  201.     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
  202.     if (mg->mg_type == type)
  203.         return mg;
  204.     }
  205.     return 0;
  206. }
  207.  
  208. int
  209. mg_copy(sv, nsv, key, klen)
  210. SV* sv;
  211. SV* nsv;
  212. char *key;
  213. STRLEN klen;
  214. {
  215.     int count = 0;
  216.     MAGIC* mg;
  217.     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
  218.     if (isUPPER(mg->mg_type)) {
  219.         sv_magic(nsv, mg->mg_obj, toLOWER(mg->mg_type), key, klen);
  220.         count++;
  221.     }
  222.     }
  223.     return count;
  224. }
  225.  
  226. int
  227. mg_free(sv)
  228. SV* sv;
  229. {
  230.     MAGIC* mg;
  231.     MAGIC* moremagic;
  232.     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
  233.     MGVTBL* vtbl = mg->mg_virtual;
  234.     moremagic = mg->mg_moremagic;
  235.     if (vtbl && vtbl->svt_free)
  236.         (*vtbl->svt_free)(sv, mg);
  237.     if (mg->mg_ptr && mg->mg_type != 'g')
  238.         Safefree(mg->mg_ptr);
  239.     if (mg->mg_flags & MGf_REFCOUNTED)
  240.         SvREFCNT_dec(mg->mg_obj);
  241.     Safefree(mg);
  242.     }
  243.     SvMAGIC(sv) = 0;
  244.     return 0;
  245. }
  246.  
  247. #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
  248. #include <signal.h>
  249. #endif
  250.  
  251. U32
  252. magic_len(sv, mg)
  253. SV *sv;
  254. MAGIC *mg;
  255. {
  256.     register I32 paren;
  257.     register char *s;
  258.     register I32 i;
  259.     char *t;
  260.  
  261.     switch (*mg->mg_ptr) {
  262.     case '1': case '2': case '3': case '4':
  263.     case '5': case '6': case '7': case '8': case '9': case '&':
  264.     if (curpm) {
  265.         paren = atoi(mg->mg_ptr);
  266.       getparen:
  267.         if (curpm->op_pmregexp &&
  268.           paren <= curpm->op_pmregexp->nparens &&
  269.           (s = curpm->op_pmregexp->startp[paren]) &&
  270.           (t = curpm->op_pmregexp->endp[paren]) ) {
  271.         i = t - s;
  272.         if (i >= 0)
  273.             return i;
  274.         }
  275.     }
  276.     return 0;
  277.     break;
  278.     case '+':
  279.     if (curpm) {
  280.         paren = curpm->op_pmregexp->lastparen;
  281.         if (!paren)
  282.         return 0;
  283.         goto getparen;
  284.     }
  285.     return 0;
  286.     break;
  287.     case '`':
  288.     if (curpm) {
  289.         if (curpm->op_pmregexp &&
  290.           (s = curpm->op_pmregexp->subbeg) ) {
  291.         i = curpm->op_pmregexp->startp[0] - s;
  292.         if (i >= 0)
  293.             return i;
  294.         }
  295.     }
  296.     return 0;
  297.     case '\'':
  298.     if (curpm) {
  299.         if (curpm->op_pmregexp &&
  300.           (s = curpm->op_pmregexp->endp[0]) ) {
  301.         return (STRLEN) (curpm->op_pmregexp->subend - s);
  302.         }
  303.     }
  304.     return 0;
  305.     case ',':
  306.     return (STRLEN)ofslen;
  307.     case '\\':
  308.     return (STRLEN)orslen;
  309.     }
  310.     magic_get(sv,mg);
  311.     if (!SvPOK(sv) && SvNIOK(sv))
  312.     sv_2pv(sv, &na);
  313.     if (SvPOK(sv))
  314.     return SvCUR(sv);
  315.     return 0;
  316. }
  317.  
  318. int
  319. magic_get(sv, mg)
  320. SV *sv;
  321. MAGIC *mg;
  322. {
  323.     register I32 paren;
  324.     register char *s;
  325.     register I32 i;
  326.     char *t;
  327.  
  328.     switch (*mg->mg_ptr) {
  329.     case '\001':        /* ^A */
  330.     sv_setsv(sv, bodytarget);
  331.     break;
  332.     case '\004':        /* ^D */
  333.     sv_setiv(sv,(I32)(debug & 32767));
  334.     break;
  335.     case '\005':  /* ^E */
  336. #ifdef VMS
  337.     {
  338. #        include <descrip.h>
  339. #        include <starlet.h>
  340.         char msg[255];
  341.         $DESCRIPTOR(msgdsc,msg);
  342.         sv_setnv(sv,(double)vaxc$errno);
  343.         if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
  344.         sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
  345.         else
  346.         sv_setpv(sv,"");
  347.     }
  348. #else
  349.     sv_setnv(sv,(double)errno);
  350.     sv_setpv(sv, errno ? Strerror(errno) : "");
  351. #endif
  352.     SvNOK_on(sv);    /* what a wonderful hack! */
  353.     break;
  354.     case '\006':        /* ^F */
  355.     sv_setiv(sv,(I32)maxsysfd);
  356.     break;
  357.     case '\010':        /* ^H */
  358.     sv_setiv(sv,(I32)hints);
  359.     break;
  360.     case '\t':            /* ^I */
  361.     if (inplace)
  362.         sv_setpv(sv, inplace);
  363.     else
  364.         sv_setsv(sv,&sv_undef);
  365.     break;
  366.     case '\017':        /* ^O */
  367.     sv_setpv(sv,osname);
  368.     break;
  369.     case '\020':        /* ^P */
  370.     sv_setiv(sv,(I32)perldb);
  371.     break;
  372.     case '\024':        /* ^T */
  373.     sv_setiv(sv,(I32)basetime);
  374.     break;
  375.     case '\027':        /* ^W */
  376.     sv_setiv(sv,(I32)dowarn);
  377.     break;
  378.     case '1': case '2': case '3': case '4':
  379.     case '5': case '6': case '7': case '8': case '9': case '&':
  380.     if (curpm) {
  381.         paren = atoi(GvENAME(mg->mg_obj));
  382.       getparen:
  383.         if (curpm->op_pmregexp &&
  384.           paren <= curpm->op_pmregexp->nparens &&
  385.           (s = curpm->op_pmregexp->startp[paren]) &&
  386.           (t = curpm->op_pmregexp->endp[paren]) ) {
  387.         i = t - s;
  388.         if (i >= 0) {
  389.             MAGIC *tmg;
  390.             sv_setpvn(sv,s,i);
  391.             if (tainting && (tmg = mg_find(sv,'t')))
  392.             tmg->mg_len = 0;    /* guarantee $1 untainted */
  393.             break;
  394.         }
  395.         }
  396.     }
  397.     sv_setsv(sv,&sv_undef);
  398.     break;
  399.     case '+':
  400.     if (curpm) {
  401.         paren = curpm->op_pmregexp->lastparen;
  402.         if (paren)
  403.         goto getparen;
  404.     }
  405.     sv_setsv(sv,&sv_undef);
  406.     break;
  407.     case '`':
  408.     if (curpm) {
  409.         if (curpm->op_pmregexp &&
  410.           (s = curpm->op_pmregexp->subbeg) ) {
  411.         i = curpm->op_pmregexp->startp[0] - s;
  412.         if (i >= 0) {
  413.             sv_setpvn(sv,s,i);
  414.             break;
  415.         }
  416.         }
  417.     }
  418.     sv_setsv(sv,&sv_undef);
  419.     break;
  420.     case '\'':
  421.     if (curpm) {
  422.         if (curpm->op_pmregexp &&
  423.           (s = curpm->op_pmregexp->endp[0]) ) {
  424.         sv_setpvn(sv,s, curpm->op_pmregexp->subend - s);
  425.         break;
  426.         }
  427.     }
  428.     sv_setsv(sv,&sv_undef);
  429.     break;
  430.     case '.':
  431. #ifndef lint
  432.     if (GvIO(last_in_gv)) {
  433.         sv_setiv(sv,(I32)IoLINES(GvIO(last_in_gv)));
  434.     }
  435. #endif
  436.     break;
  437.     case '?':
  438.     sv_setiv(sv,(I32)statusvalue);
  439.     break;
  440.     case '^':
  441.     s = IoTOP_NAME(GvIOp(defoutgv));
  442.     if (s)
  443.         sv_setpv(sv,s);
  444.     else {
  445.         sv_setpv(sv,GvENAME(defoutgv));
  446.         sv_catpv(sv,"_TOP");
  447.     }
  448.     break;
  449.     case '~':
  450.     s = IoFMT_NAME(GvIOp(defoutgv));
  451.     if (!s)
  452.         s = GvENAME(defoutgv);
  453.     sv_setpv(sv,s);
  454.     break;
  455. #ifndef lint
  456.     case '=':
  457.     sv_setiv(sv,(I32)IoPAGE_LEN(GvIOp(defoutgv)));
  458.     break;
  459.     case '-':
  460.     sv_setiv(sv,(I32)IoLINES_LEFT(GvIOp(defoutgv)));
  461.     break;
  462.     case '%':
  463.     sv_setiv(sv,(I32)IoPAGE(GvIOp(defoutgv)));
  464.     break;
  465. #endif
  466.     case ':':
  467.     break;
  468.     case '/':
  469.     break;
  470.     case '[':
  471.     sv_setiv(sv,(I32)curcop->cop_arybase);
  472.     break;
  473.     case '|':
  474.     sv_setiv(sv, (IoFLAGS(GvIOp(defoutgv)) & IOf_FLUSH) != 0 );
  475.     break;
  476.     case ',':
  477.     sv_setpvn(sv,ofs,ofslen);
  478.     break;
  479.     case '\\':
  480.     sv_setpvn(sv,ors,orslen);
  481.     break;
  482.     case '#':
  483.     sv_setpv(sv,ofmt);
  484.     break;
  485.     case '!':
  486. #ifdef VMS
  487.     sv_setnv(sv,(double)((errno == EVMSERR) ? vaxc$errno : errno));
  488. #else
  489.     sv_setnv(sv,(double)errno);
  490. #endif
  491.     sv_setpv(sv, errno ? Strerror(errno) : "");
  492.     SvNOK_on(sv);    /* what a wonderful hack! */
  493.     break;
  494.     case '<':
  495.     sv_setiv(sv,(I32)uid);
  496.     break;
  497.     case '>':
  498.     sv_setiv(sv,(I32)euid);
  499.     break;
  500.     case '(':
  501.     s = buf;
  502.     (void)sprintf(s,"%d",(int)gid);
  503.     goto add_groups;
  504.     case ')':
  505.     s = buf;
  506.     (void)sprintf(s,"%d",(int)egid);
  507.       add_groups:
  508.     while (*s) s++;
  509. #ifdef HAS_GETGROUPS
  510. #ifndef NGROUPS
  511. #define NGROUPS 32
  512. #endif
  513.     {
  514.         Groups_t gary[NGROUPS];
  515.  
  516.         i = getgroups(NGROUPS,gary);
  517.         while (--i >= 0) {
  518.         (void)sprintf(s," %ld", (long)gary[i]);
  519.         while (*s) s++;
  520.         }
  521.     }
  522. #endif
  523.     sv_setpv(sv,buf);
  524.     break;
  525.     case '*':
  526.     break;
  527.     case '0':
  528.     break;
  529.     }
  530.     return 0;
  531. }
  532.  
  533. int
  534. magic_getuvar(sv, mg)
  535. SV *sv;
  536. MAGIC *mg;
  537. {
  538.     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
  539.  
  540.     if (uf && uf->uf_val)
  541.     (*uf->uf_val)(uf->uf_index, sv);
  542.     return 0;
  543. }
  544.  
  545. int
  546. magic_setenv(sv,mg)
  547. SV* sv;
  548. MAGIC* mg;
  549. {
  550.     register char *s;
  551.     STRLEN len;
  552.     I32 i;
  553.     s = SvPV(sv,len);
  554.     my_setenv(mg->mg_ptr,s);
  555. #ifdef DYNAMIC_ENV_FETCH
  556.      /* We just undefd an environment var.  Is a replacement */
  557.      /* waiting in the wings? */
  558.     if (!len) {
  559.     SV **envsvp;
  560.     if (envsvp = hv_fetch(GvHVn(envgv),mg->mg_ptr,mg->mg_len,FALSE))
  561.         s = SvPV(*envsvp,len);
  562.     }
  563. #endif
  564.                 /* And you'll never guess what the dog had */
  565.                 /*   in its mouth... */
  566.     if (tainting) {
  567.     if (s && strEQ(mg->mg_ptr,"PATH")) {
  568.         char *strend = s + len;
  569.  
  570.         while (s < strend) {
  571.         s = cpytill(tokenbuf,s,strend,':',&i);
  572.         s++;
  573.         if (*tokenbuf != '/'
  574.           || (Stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
  575.             MgTAINTEDDIR_on(mg);
  576.         }
  577.     }
  578.     }
  579.     return 0;
  580. }
  581.  
  582. int
  583. magic_clearenv(sv,mg)
  584. SV* sv;
  585. MAGIC* mg;
  586. {
  587.     my_setenv(mg->mg_ptr,Nullch);
  588.     return 0;
  589. }
  590.  
  591. #ifdef HAS_SIGACTION
  592. /* set up reliable signal() clone */
  593.  
  594. typedef void (*Sigfunc) _((int));
  595.  
  596. static
  597. Sigfunc rsignal(signo,handler)
  598. int signo;
  599. Sigfunc handler;
  600. {
  601.     struct sigaction act,oact;
  602.     
  603.     act.sa_handler = handler;
  604.     sigemptyset(&act.sa_mask);
  605.     act.sa_flags = 0;
  606. #ifdef SIGALRM    
  607.     if (signo == SIGALRM) {
  608. #else
  609.     if (0) {
  610. #endif        
  611. #ifdef SA_INTERRUPT
  612.     act.sa_flags |= SA_INTERRUPT;    /* SunOS */
  613. #endif    
  614.     } else {
  615. #ifdef SA_RESTART
  616.     act.sa_flags |= SA_RESTART;    /* SVR4, 4.3+BSD */
  617. #endif
  618.     }
  619.     if (sigaction(signo, &act, &oact) < 0)
  620.         return(SIG_ERR);
  621.     else
  622.         return(oact.sa_handler);
  623. }
  624.  
  625. #else
  626.  
  627. /* ah well, so much for reliability */
  628.  
  629. #define rsignal(x,y) signal(x,y)
  630.  
  631. #endif
  632.  
  633.  
  634. int
  635. magic_setsig(sv,mg)
  636. SV* sv;
  637. MAGIC* mg;
  638. {
  639.     register char *s;
  640.     I32 i;
  641.     SV** svp;
  642.  
  643.     s = mg->mg_ptr;
  644.     if (*s == '_') {
  645.     if (strEQ(s,"__DIE__"))
  646.         svp = &diehook;
  647.     else if (strEQ(s,"__WARN__"))
  648.         svp = &warnhook;
  649.     else if (strEQ(s,"__PARSE__"))
  650.         svp = &parsehook;
  651.     else
  652.         croak("No such hook: %s", s);
  653.     i = 0;
  654.     if (*svp) {
  655.         SvREFCNT_dec(*svp);
  656.         *svp = 0;
  657.     }
  658.     }
  659.     else {
  660.     i = whichsig(s);    /* ...no, a brick */
  661.     if (!i) {
  662.         if (dowarn || strEQ(s,"ALARM"))
  663.         warn("No such signal: SIG%s", s);
  664.         return 0;
  665.     }
  666.     }
  667.     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
  668.     if (i)
  669.         (void)rsignal(i,sighandler);
  670.     else
  671.         *svp = SvREFCNT_inc(sv);
  672.     return 0;
  673.     }
  674.     s = SvPV_force(sv,na);
  675.     if (strEQ(s,"IGNORE")) {
  676.     if (i)
  677.         (void)rsignal(i,SIG_IGN);
  678.     else
  679.         *svp = 0;
  680.     }
  681.     else if (strEQ(s,"DEFAULT") || !*s) {
  682.     if (i)
  683.         (void)rsignal(i,SIG_DFL);
  684.     else
  685.         *svp = 0;
  686.     }
  687.     else {
  688.     if (!strchr(s,':') && !strchr(s,'\'')) {
  689.         sprintf(tokenbuf, "main::%s",s);
  690.         sv_setpv(sv,tokenbuf);
  691.     }
  692.     if (i)
  693.         (void)rsignal(i,sighandler);
  694.     else
  695.         *svp = SvREFCNT_inc(sv);
  696.     }
  697.     return 0;
  698. }
  699.  
  700. int
  701. magic_setisa(sv,mg)
  702. SV* sv;
  703. MAGIC* mg;
  704. {
  705.     sub_generation++;
  706.     return 0;
  707. }
  708.  
  709. #ifdef OVERLOAD
  710.  
  711. int
  712. magic_setamagic(sv,mg)
  713. SV* sv;
  714. MAGIC* mg;
  715. {
  716.     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
  717.     amagic_generation++;
  718.  
  719.     return 0;
  720. }
  721. #endif /* OVERLOAD */
  722.  
  723. static int
  724. magic_methpack(sv,mg,meth)
  725. SV* sv;
  726. MAGIC* mg;
  727. char *meth;
  728. {
  729.     dSP;
  730.  
  731.     ENTER;
  732.     SAVETMPS;
  733.     PUSHMARK(sp);
  734.     EXTEND(sp, 2);
  735.     PUSHs(mg->mg_obj);
  736.     if (mg->mg_ptr)
  737.     PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
  738.     else if (mg->mg_type == 'p')
  739.     PUSHs(sv_2mortal(newSViv(mg->mg_len)));
  740.     PUTBACK;
  741.  
  742.     if (perl_call_method(meth, G_SCALAR))
  743.     sv_setsv(sv, *stack_sp--);
  744.  
  745.     FREETMPS;
  746.     LEAVE;
  747.     return 0;
  748. }
  749.  
  750. int
  751. magic_getpack(sv,mg)
  752. SV* sv;
  753. MAGIC* mg;
  754. {
  755.     magic_methpack(sv,mg,"FETCH");
  756.     if (mg->mg_ptr)
  757.     mg->mg_flags |= MGf_GSKIP;
  758.     return 0;
  759. }
  760.  
  761. int
  762. magic_setpack(sv,mg)
  763. SV* sv;
  764. MAGIC* mg;
  765. {
  766.     dSP;
  767.  
  768.     PUSHMARK(sp);
  769.     EXTEND(sp, 3);
  770.     PUSHs(mg->mg_obj);
  771.     if (mg->mg_ptr)
  772.     PUSHs(sv_2mortal(newSVpv(mg->mg_ptr, mg->mg_len)));
  773.     else if (mg->mg_type == 'p')
  774.     PUSHs(sv_2mortal(newSViv(mg->mg_len)));
  775.     PUSHs(sv);
  776.     PUTBACK;
  777.  
  778.     perl_call_method("STORE", G_SCALAR|G_DISCARD);
  779.  
  780.     return 0;
  781. }
  782.  
  783. int
  784. magic_clearpack(sv,mg)
  785. SV* sv;
  786. MAGIC* mg;
  787. {
  788.     return magic_methpack(sv,mg,"DELETE");
  789. }
  790.  
  791. int magic_wipepack(sv,mg)
  792. SV* sv;
  793. MAGIC* mg;
  794. {
  795.     dSP;
  796.  
  797.     PUSHMARK(sp);
  798.     XPUSHs(mg->mg_obj);
  799.     PUTBACK;
  800.  
  801.     perl_call_method("CLEAR", G_SCALAR|G_DISCARD);
  802.  
  803.     return 0;
  804. }
  805.  
  806. int
  807. magic_nextpack(sv,mg,key)
  808. SV* sv;
  809. MAGIC* mg;
  810. SV* key;
  811. {
  812.     dSP;
  813.     char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
  814.  
  815.     ENTER;
  816.     SAVETMPS;
  817.     PUSHMARK(sp);
  818.     EXTEND(sp, 2);
  819.     PUSHs(mg->mg_obj);
  820.     if (SvOK(key))
  821.     PUSHs(key);
  822.     PUTBACK;
  823.  
  824.     if (perl_call_method(meth, G_SCALAR))
  825.     sv_setsv(key, *stack_sp--);
  826.  
  827.     FREETMPS;
  828.     LEAVE;
  829.     return 0;
  830. }
  831.  
  832. int
  833. magic_existspack(sv,mg)
  834. SV* sv;
  835. MAGIC* mg;
  836. {
  837.     return magic_methpack(sv,mg,"EXISTS");
  838.  
  839. int
  840. magic_setdbline(sv,mg)
  841. SV* sv;
  842. MAGIC* mg;
  843. {
  844.     OP *o;
  845.     I32 i;
  846.     GV* gv;
  847.     SV** svp;
  848.  
  849.     gv = DBline;
  850.     i = SvTRUE(sv);
  851.     svp = av_fetch(GvAV(gv),atoi(mg->mg_ptr), FALSE);
  852.     if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
  853.     o->op_private = i;
  854.     else
  855.     warn("Can't break at that line\n");
  856.     return 0;
  857. }
  858.  
  859. int
  860. magic_getarylen(sv,mg)
  861. SV* sv;
  862. MAGIC* mg;
  863. {
  864.     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + curcop->cop_arybase);
  865.     return 0;
  866. }
  867.  
  868. int
  869. magic_setarylen(sv,mg)
  870. SV* sv;
  871. MAGIC* mg;
  872. {
  873.     av_fill((AV*)mg->mg_obj, SvIV(sv) - curcop->cop_arybase);
  874.     return 0;
  875. }
  876.  
  877. int
  878. magic_getpos(sv,mg)
  879. SV* sv;
  880. MAGIC* mg;
  881. {
  882.     SV* lsv = LvTARG(sv);
  883.     
  884.     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
  885.     mg = mg_find(lsv, 'g');
  886.     if (mg && mg->mg_len >= 0) {
  887.         sv_setiv(sv, mg->mg_len + curcop->cop_arybase);
  888.         return 0;
  889.     }
  890.     }
  891.     (void)SvOK_off(sv);
  892.     return 0;
  893. }
  894.  
  895. int
  896. magic_setpos(sv,mg)
  897. SV* sv;
  898. MAGIC* mg;
  899. {
  900.     SV* lsv = LvTARG(sv);
  901.     SSize_t pos;
  902.     STRLEN len;
  903.  
  904.     mg = 0;
  905.     
  906.     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
  907.     mg = mg_find(lsv, 'g');
  908.     if (!mg) {
  909.     if (!SvOK(sv))
  910.         return 0;
  911.     sv_magic(lsv, (SV*)0, 'g', Nullch, 0);
  912.     mg = mg_find(lsv, 'g');
  913.     }
  914.     else if (!SvOK(sv)) {
  915.     mg->mg_len = -1;
  916.     return 0;
  917.     }
  918.     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
  919.  
  920.     pos = SvIV(sv) - curcop->cop_arybase;
  921.     if (pos < 0) {
  922.     pos += len;
  923.     if (pos < 0)
  924.         pos = 0;
  925.     }
  926.     else if (pos > len)
  927.     pos = len;
  928.     mg->mg_len = pos;
  929.  
  930.     return 0;
  931. }
  932.  
  933. int
  934. magic_getglob(sv,mg)
  935. SV* sv;
  936. MAGIC* mg;
  937. {
  938.     gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
  939.     return 0;
  940. }
  941.  
  942. int
  943. magic_setglob(sv,mg)
  944. SV* sv;
  945. MAGIC* mg;
  946. {
  947.     register char *s;
  948.     GV* gv;
  949.  
  950.     if (!SvOK(sv))
  951.     return 0;
  952.     s = SvPV(sv, na);
  953.     if (*s == '*' && s[1])
  954.     s++;
  955.     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
  956.     if (sv == (SV*)gv)
  957.     return 0;
  958.     if (GvGP(sv))
  959.     gp_free(sv);
  960.     GvGP(sv) = gp_ref(GvGP(gv));
  961.     if (!GvAV(gv))
  962.     gv_AVadd(gv);
  963.     if (!GvHV(gv))
  964.     gv_HVadd(gv);
  965.     if (!GvIOp(gv))
  966.     GvIOp(gv) = newIO();
  967.     return 0;
  968. }
  969.  
  970. int
  971. magic_setsubstr(sv,mg)
  972. SV* sv;
  973. MAGIC* mg;
  974. {
  975.     STRLEN len;
  976.     char *tmps = SvPV(sv,len);
  977.     sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
  978.     return 0;
  979. }
  980.  
  981. int
  982. magic_gettaint(sv,mg)
  983. SV* sv;
  984. MAGIC* mg;
  985. {
  986.     if (mg->mg_len & 1)
  987.     tainted = TRUE;
  988.     else if (mg->mg_len & 2 && mg->mg_obj == sv)    /* kludge */
  989.     tainted = TRUE;
  990.     return 0;
  991. }
  992.  
  993. int
  994. magic_settaint(sv,mg)
  995. SV* sv;
  996. MAGIC* mg;
  997. {
  998.     if (localizing) {
  999.     if (localizing == 1)
  1000.         mg->mg_len <<= 1;
  1001.     else
  1002.         mg->mg_len >>= 1;
  1003.     }
  1004.     else if (tainted)
  1005.     mg->mg_len |= 1;
  1006.     else
  1007.     mg->mg_len &= ~1;
  1008.     return 0;
  1009. }
  1010.  
  1011. int
  1012. magic_setvec(sv,mg)
  1013. SV* sv;
  1014. MAGIC* mg;
  1015. {
  1016.     do_vecset(sv);    /* XXX slurp this routine */
  1017.     return 0;
  1018. }
  1019.  
  1020. int
  1021. magic_setmglob(sv,mg)
  1022. SV* sv;
  1023. MAGIC* mg;
  1024. {
  1025.     mg->mg_len = -1;
  1026.     SvSCREAM_off(sv);
  1027.     return 0;
  1028. }
  1029.  
  1030. int
  1031. magic_setbm(sv,mg)
  1032. SV* sv;
  1033. MAGIC* mg;
  1034. {
  1035.     sv_unmagic(sv, 'B');
  1036.     SvVALID_off(sv);
  1037.     return 0;
  1038. }
  1039.  
  1040. int
  1041. magic_setuvar(sv,mg)
  1042. SV* sv;
  1043. MAGIC* mg;
  1044. {
  1045.     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
  1046.  
  1047.     if (uf && uf->uf_set)
  1048.     (*uf->uf_set)(uf->uf_index, sv);
  1049.     return 0;
  1050. }
  1051.  
  1052. int
  1053. magic_set(sv,mg)
  1054. SV* sv;
  1055. MAGIC* mg;
  1056. {
  1057.     register char *s;
  1058.     I32 i;
  1059.     STRLEN len;
  1060.     switch (*mg->mg_ptr) {
  1061.     case '\001':    /* ^A */
  1062.     sv_setsv(bodytarget, sv);
  1063.     break;
  1064.     case '\004':    /* ^D */
  1065.     debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
  1066.     DEBUG_x(dump_all());
  1067.     break;
  1068.     case '\005':  /* ^E */
  1069. #ifdef VMS
  1070.     set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1071. #else
  1072.     SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),4);        /* will anyone ever use this? */
  1073. #endif
  1074.     break;
  1075.     case '\006':    /* ^F */
  1076.     maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1077.     break;
  1078.     case '\010':    /* ^H */
  1079.     hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1080.     break;
  1081.     case '\t':    /* ^I */
  1082.     if (inplace)
  1083.         Safefree(inplace);
  1084.     if (SvOK(sv))
  1085.         inplace = savepv(SvPV(sv,na));
  1086.     else
  1087.         inplace = Nullch;
  1088.     break;
  1089.     case '\017':    /* ^O */
  1090.     if (osname)
  1091.         Safefree(osname);
  1092.     if (SvOK(sv))
  1093.         osname = savepv(SvPV(sv,na));
  1094.     else
  1095.         osname = Nullch;
  1096.     break;
  1097.     case '\020':    /* ^P */
  1098.     i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1099.     if (i != perldb) {
  1100.         if (perldb)
  1101.         oldlastpm = curpm;
  1102.         else
  1103.         curpm = oldlastpm;
  1104.     }
  1105.     perldb = i;
  1106.     break;
  1107.     case '\024':    /* ^T */
  1108.     basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1109.     break;
  1110.     case '\027':    /* ^W */
  1111.     dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1112.     break;
  1113.     case '.':
  1114.     if (localizing) {
  1115.         if (localizing == 1)
  1116.         save_sptr((SV**)&last_in_gv);
  1117.     }
  1118.     else if (SvOK(sv))
  1119.         IoLINES(GvIOp(last_in_gv)) = (long)SvIV(sv);
  1120.     break;
  1121.     case '^':
  1122.     Safefree(IoTOP_NAME(GvIOp(defoutgv)));
  1123.     IoTOP_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
  1124.     IoTOP_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
  1125.     break;
  1126.     case '~':
  1127.     Safefree(IoFMT_NAME(GvIOp(defoutgv)));
  1128.     IoFMT_NAME(GvIOp(defoutgv)) = s = savepv(SvPV(sv,na));
  1129.     IoFMT_GV(GvIOp(defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
  1130.     break;
  1131.     case '=':
  1132.     IoPAGE_LEN(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1133.     break;
  1134.     case '-':
  1135.     IoLINES_LEFT(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1136.     if (IoLINES_LEFT(GvIOp(defoutgv)) < 0L)
  1137.         IoLINES_LEFT(GvIOp(defoutgv)) = 0L;
  1138.     break;
  1139.     case '%':
  1140.     IoPAGE(GvIOp(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1141.     break;
  1142.     case '|':
  1143.     IoFLAGS(GvIOp(defoutgv)) &= ~IOf_FLUSH;
  1144.     if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
  1145.         IoFLAGS(GvIOp(defoutgv)) |= IOf_FLUSH;
  1146.     }
  1147.     break;
  1148.     case '*':
  1149.     i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1150.     multiline = (i != 0);
  1151.     break;
  1152.     case '/':
  1153.     SvREFCNT_dec(nrs);
  1154.     nrs = newSVsv(sv);
  1155.     SvREFCNT_dec(rs);
  1156.     rs = SvREFCNT_inc(nrs);
  1157.     break;
  1158.     case '\\':
  1159.     if (ors)
  1160.         Safefree(ors);
  1161.     ors = savepv(SvPV(sv,orslen));
  1162.     break;
  1163.     case ',':
  1164.     if (ofs)
  1165.         Safefree(ofs);
  1166.     ofs = savepv(SvPV(sv, ofslen));
  1167.     break;
  1168.     case '#':
  1169.     if (ofmt)
  1170.         Safefree(ofmt);
  1171.     ofmt = savepv(SvPV(sv,na));
  1172.     break;
  1173.     case '[':
  1174.     compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1175.     break;
  1176.     case '?':
  1177.     statusvalue = FIXSTATUS(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
  1178.     break;
  1179.     case '!':
  1180.     SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv),SvIV(sv) == EVMSERR ? 4 : vaxc$errno);        /* will anyone ever use this? */
  1181.     break;
  1182.     case '<':
  1183.     uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1184.     if (delaymagic) {
  1185.         delaymagic |= DM_RUID;
  1186.         break;                /* don't do magic till later */
  1187.     }
  1188. #ifdef HAS_SETRUID
  1189.     (void)setruid((Uid_t)uid);
  1190. #else
  1191. #ifdef HAS_SETREUID
  1192.     (void)setreuid((Uid_t)uid, (Uid_t)-1);
  1193. #else
  1194. #ifdef HAS_SETRESUID
  1195.       (void)setresuid((Uid_t)uid, (Uid_t)-1, (Uid_t)-1);
  1196. #else
  1197.     if (uid == euid)        /* special case $< = $> */
  1198.         (void)setuid(uid);
  1199.     else {
  1200.         uid = (I32)getuid();
  1201.         croak("setruid() not implemented");
  1202.     }
  1203. #endif
  1204. #endif
  1205. #endif
  1206.     uid = (I32)getuid();
  1207.     tainting |= (uid && (euid != uid || egid != gid));
  1208.     break;
  1209.     case '>':
  1210.     euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1211.     if (delaymagic) {
  1212.         delaymagic |= DM_EUID;
  1213.         break;                /* don't do magic till later */
  1214.     }
  1215. #ifdef HAS_SETEUID
  1216.     (void)seteuid((Uid_t)euid);
  1217. #else
  1218. #ifdef HAS_SETREUID
  1219.     (void)setreuid((Uid_t)-1, (Uid_t)euid);
  1220. #else
  1221. #ifdef HAS_SETRESUID
  1222.     (void)setresuid((Uid_t)-1, (Uid_t)euid, (Uid_t)-1);
  1223. #else
  1224.     if (euid == uid)        /* special case $> = $< */
  1225.         setuid(euid);
  1226.     else {
  1227.         euid = (I32)geteuid();
  1228.         croak("seteuid() not implemented");
  1229.     }
  1230. #endif
  1231. #endif
  1232. #endif
  1233.     euid = (I32)geteuid();
  1234.     tainting |= (uid && (euid != uid || egid != gid));
  1235.     break;
  1236.     case '(':
  1237.     gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1238.     if (delaymagic) {
  1239.         delaymagic |= DM_RGID;
  1240.         break;                /* don't do magic till later */
  1241.     }
  1242. #ifdef HAS_SETRGID
  1243.     (void)setrgid((Gid_t)gid);
  1244. #else
  1245. #ifdef HAS_SETREGID
  1246.     (void)setregid((Gid_t)gid, (Gid_t)-1);
  1247. #else
  1248. #ifdef HAS_SETRESGID
  1249.       (void)setresgid((Gid_t)gid, (Gid_t)-1, (Gid_t) 1);
  1250. #else
  1251.     if (gid == egid)            /* special case $( = $) */
  1252.         (void)setgid(gid);
  1253.     else {
  1254.         gid = (I32)getgid();
  1255.         croak("setrgid() not implemented");
  1256.     }
  1257. #endif
  1258. #endif
  1259. #endif
  1260.     gid = (I32)getgid();
  1261.     tainting |= (uid && (euid != uid || egid != gid));
  1262.     break;
  1263.     case ')':
  1264.     egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
  1265.     if (delaymagic) {
  1266.         delaymagic |= DM_EGID;
  1267.         break;                /* don't do magic till later */
  1268.     }
  1269. #ifdef HAS_SETEGID
  1270.     (void)setegid((Gid_t)egid);
  1271. #else
  1272. #ifdef HAS_SETREGID
  1273.     (void)setregid((Gid_t)-1, (Gid_t)egid);
  1274. #else
  1275. #ifdef HAS_SETRESGID
  1276.     (void)setresgid((Gid_t)-1, (Gid_t)egid, (Gid_t)-1);
  1277. #else
  1278.     if (egid == gid)            /* special case $) = $( */
  1279.         (void)setgid(egid);
  1280.     else {
  1281.         egid = (I32)getegid();
  1282.         croak("setegid() not implemented");
  1283.     }
  1284. #endif
  1285. #endif
  1286. #endif
  1287.     egid = (I32)getegid();
  1288.     tainting |= (uid && (euid != uid || egid != gid));
  1289.     break;
  1290.     case ':':
  1291.     chopset = SvPV_force(sv,na);
  1292.     break;
  1293.     case '0':
  1294.     if (!origalen) {
  1295.         s = origargv[0];
  1296.         s += strlen(s);
  1297.         /* See if all the arguments are contiguous in memory */
  1298.         for (i = 1; i < origargc; i++) {
  1299.         if (origargv[i] == s + 1)
  1300.             s += strlen(++s);    /* this one is ok too */
  1301.         }
  1302.         if (origenviron[0] == s + 1) {    /* can grab env area too? */
  1303.         my_setenv("NoNeSuCh", Nullch);
  1304.                         /* force copy of environment */
  1305.         for (i = 0; origenviron[i]; i++)
  1306.             if (origenviron[i] == s + 1)
  1307.             s += strlen(++s);
  1308.         }
  1309.         origalen = s - origargv[0];
  1310.     }
  1311.     s = SvPV_force(sv,len);
  1312.     i = len;
  1313.     if (i >= origalen) {
  1314.         i = origalen;
  1315.         SvCUR_set(sv, i);
  1316.         *SvEND(sv) = '\0';
  1317.         Copy(s, origargv[0], i, char);
  1318.     }
  1319.     else {
  1320.         Copy(s, origargv[0], i, char);
  1321.         s = origargv[0]+i;
  1322.         *s++ = '\0';
  1323.         while (++i < origalen)
  1324.         *s++ = ' ';
  1325.         s = origargv[0]+i;
  1326.         for (i = 1; i < origargc; i++)
  1327.         origargv[i] = Nullch;
  1328.     }
  1329.     break;
  1330.     }
  1331.     return 0;
  1332. }
  1333.  
  1334. I32
  1335. whichsig(sig)
  1336. char *sig;
  1337. {
  1338.     register char **sigv;
  1339.  
  1340.     for (sigv = sig_name+1; *sigv; sigv++)
  1341.     if (strEQ(sig,*sigv))
  1342.         return sig_num[sigv - sig_name];
  1343. #ifdef SIGCLD
  1344.     if (strEQ(sig,"CHLD"))
  1345.     return SIGCLD;
  1346. #endif
  1347. #ifdef SIGCHLD
  1348.     if (strEQ(sig,"CLD"))
  1349.     return SIGCHLD;
  1350. #endif
  1351.     return 0;
  1352. }
  1353.  
  1354. Signal_t
  1355. sighandler(sig)
  1356. int sig;
  1357. {
  1358.     dSP;
  1359.     GV *gv;
  1360.     HV *st;
  1361.     SV *sv;
  1362.     CV *cv;
  1363.     AV *oldstack;
  1364.     char *signame; 
  1365.  
  1366. #ifdef OS2        /* or anybody else who requires SIG_ACK */
  1367.     signal(sig, SIG_ACK);
  1368. #endif
  1369.  
  1370.     signame = sig_name[sig];
  1371.     cv = sv_2cv(*hv_fetch(GvHVn(siggv),signame,strlen(signame),
  1372.               TRUE),
  1373.         &st, &gv, TRUE);
  1374.     if (!cv || !CvROOT(cv) &&
  1375.     *signame == 'C' && instr(signame,"LD")) {
  1376.     
  1377.     if (signame[1] == 'H')
  1378.         cv = sv_2cv(*hv_fetch(GvHVn(siggv),"CLD",3,TRUE),
  1379.             &st, &gv, TRUE);
  1380.     else
  1381.         cv = sv_2cv(*hv_fetch(GvHVn(siggv),"CHLD",4,TRUE),
  1382.             &st, &gv, TRUE);
  1383.     /* gag */
  1384.     }
  1385.     if (!cv || !CvROOT(cv)) {
  1386.     if (dowarn)
  1387.         warn("SIG%s handler \"%s\" not defined.\n",
  1388.         signame, GvENAME(gv) );
  1389.     return;
  1390.     }
  1391.  
  1392.     oldstack = stack;
  1393.     if (stack != signalstack)
  1394.     AvFILL(signalstack) = 0;
  1395.     SWITCHSTACK(stack, signalstack);
  1396.  
  1397.     sv = sv_newmortal();
  1398.     sv_setpv(sv,signame);
  1399.     PUSHMARK(sp);
  1400.     PUSHs(sv);
  1401.     PUTBACK;
  1402.  
  1403.     perl_call_sv((SV*)cv, G_DISCARD);
  1404.  
  1405.     SWITCHSTACK(signalstack, oldstack);
  1406.  
  1407.     return;
  1408. }
  1409.